/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.awt.print.PrinterException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.primefaces.event.DateSelectEvent;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import static pe.com.cotelasa.common.controlador.MBGenerico.mostrarError;
import pe.com.cotelasa.helper.VentaFacturacionPrintHelper;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.controlador.backingBean.BKComponenteAddVentaDetalleNC;
import pe.com.cotelasa.scp.controlador.backingBean.BKComponenteAddVentaDetalleND;
import pe.com.cotelasa.scp.controlador.backingBean.BKVentaDetalleNotaCredito;
import pe.com.cotelasa.scp.controlador.backingBean.BKVentaDetalleNotaDebito;
import pe.com.cotelasa.scp.controlador.backingBean.BKVentaNotaCredito;
import pe.com.cotelasa.scp.controlador.backingBean.BKVentaNotaDebito;
import pe.com.cotelasa.scp.controlador.comando.ComandoActualizar;
import pe.com.cotelasa.scp.controlador.comando.ComandoGuardar;
import pe.com.cotelasa.scp.dominio.common.COLOR_ESTADO_VENTA;
import pe.com.cotelasa.scp.dominio.common.Constantes;
import pe.com.cotelasa.scp.dominio.common.ResultadoServicio;
import pe.com.cotelasa.scp.dominio.common.TIPO_MONEDA;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioCadenas;
import pe.com.cotelasa.scp.dominio.common.util.UtilitarioNumeroALetras;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioCorrelativoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioIgv;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoCambio;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoDocumento;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoMoneda;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaDetalleNotaCredito;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaDetalleNotaDebito;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaLineaCredito;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaLineaCreditoDetalle;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaNotaCredito;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaNotaDebito;
import pe.com.cotelasa.scp.entidad.Cliente;
import pe.com.cotelasa.scp.entidad.CorrelativoDocumento;
import pe.com.cotelasa.scp.entidad.TipoCambio;
import pe.com.cotelasa.scp.entidad.TipoDocumento;
import pe.com.cotelasa.scp.entidad.TipoMoneda;
import pe.com.cotelasa.scp.entidad.VentaDetalleNotaCredito;
import pe.com.cotelasa.scp.entidad.VentaDetalleNotaDebito;
import pe.com.cotelasa.scp.entidad.VentaLineaCredito;
import pe.com.cotelasa.scp.entidad.VentaLineaCreditoDetalle;
import pe.com.cotelasa.scp.entidad.VentaNotaCredito;
import pe.com.cotelasa.scp.entidad.VentaNotaDebito;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author Jorge
 */
@Named(value = "MBVentaNotaDebito")
@Scope("request")
public class MBVentaNotaDebito extends MBGenerico implements IMantenedor, IObserver, Serializable {

    private static Logger logger = Logger.getLogger(MBVentaNotaDebito.class);
    @Inject
    private BKVentaNotaDebito bkVentaNotaDebito;
    @Inject
    private BKVentaDetalleNotaDebito bkVentaDetalleNotaDebito;
    @Inject
    private IServicioVentaNotaDebito servicioVentaNotaDebito;
    @Inject
    private IServicioVentaDetalleNotaDebito servicioVentaDetalleNotaDebito;
    @Inject
    private IServicioTipoMoneda servicioTipoMoneda;
    @Inject
    private IServicioIgv servicioIgv;
    @Inject
    private MBComponenteFindCliente mbComponenteFindCliente;
    @Inject
    private MBComponenteAddVentaDetalleND mbComponenteAddVentaDetalleND;
    @Inject
    private IServicioTipoCambio servicioTipoCambio;
    @Inject
    private IServicioTipoDocumento servicioTipoDocumento;
    @Inject
    private IServicioCorrelativoDocumento servicioCorrelativo;
    @Inject
    private IServicioVentaLineaCredito servicioVentaLineaCredito;
    @Inject
    private IServicioVentaLineaCreditoDetalle servicioVentaLineaCreditoDetalle;
    @Autowired
    BKSession session;

    @Override
    public String actualizar() {

        try {
            VentaLineaCredito linea = servicioVentaLineaCredito.getVentaLineaCredito(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getRuc());
            if (linea == null) {
                mostrarWarning("El cliente no tiene linea de credito asignado.");
                return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_DEBITO;
            } else if (linea.getLineaSaldo() < bkVentaNotaDebito.getVentaNotaDebitoFormulario().getTotal()) {
                mostrarWarning("Linea de credito insuficiente.");
                return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_DEBITO;
            }


            bkVentaNotaDebito.getVentaNotaDebitoFormulario().setUsrModificacion(session.getUsuario().getUsuario());
            bkVentaNotaDebito.getVentaNotaDebitoFormulario().setFecModificacion(new Date());

            servicioVentaNotaDebito.actualizarVentaNotaDebito(bkVentaNotaDebito.getVentaNotaDebitoFormulario());
            //Integer ID = (Integer) rs.getID();

            List<VentaDetalleNotaDebito> listaAux = new ArrayList<VentaDetalleNotaDebito>();
            for (VentaDetalleNotaDebito detalle : bkVentaDetalleNotaDebito.getListaDetalleNotaDebito()) {
                listaAux.add(detalle);
            }

            servicioVentaNotaDebito.eliminarDetalleND(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getCodnd());
            //guardamos el detalle
            for (VentaDetalleNotaDebito det : listaAux) {

                det.setCodnd(bkVentaNotaDebito.getVentaNotaDebitoFormulario());
                servicioVentaDetalleNotaDebito.guardarVentaDetalleNotaDebito(det);
            }

            bkVentaNotaDebito.setVentaNotaDebitoSeleccionado(bkVentaNotaDebito.getVentaNotaDebitoFormulario());
            buscarListaNotasDebito();
            //return URLPaginacion.Ventas.URL_FORMULARIO_EDITAR_NOTA_DEBITO;
            mostrarMensaje("Se actualizó la Nota de Débito satisfactoriamente.");


        } catch (ServiceException e) {
            e.printStackTrace();
        }

        return editar();
    }

    @Override
    public String guardar() {
        boolean flag = true;
        try {

            flag = servicioVentaNotaDebito.esNumeroDocCorrecta(bkVentaNotaDebito.getVentaNotaDebitoFormulario());

            if (flag) {
                mostrarError("El número de Nota de Débito ya ha sido registrado.");
                return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_DEBITO;
            }

            VentaLineaCredito linea = servicioVentaLineaCredito.getVentaLineaCredito(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getRuc());
            if (linea == null) {
                mostrarWarning("El cliente no tiene linea de credito asignado.");
                return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_DEBITO;
            } else if (linea.getLineaSaldo() < bkVentaNotaDebito.getVentaNotaDebitoFormulario().getTotal()) {
                mostrarWarning("Linea de credito insuficiente.");
                return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_DEBITO;
            }

            //bkVentaNotaDebito.getVentaNotaDebitoFormulario().setMoneda(servicioTipoMoneda.conseguirTipoMonedaPorId(bkVentaNotaDebito.getIdTipoMoneda()));
            bkVentaNotaDebito.getVentaNotaDebitoFormulario().setEstado(COLOR_ESTADO_VENTA.CREADA.getEstado());
            bkVentaNotaDebito.getVentaNotaDebitoFormulario().setUsrCreacion(session.getUsuario().getUsuario());
            bkVentaNotaDebito.getVentaNotaDebitoFormulario().setFecCreacion(new Date());
            bkVentaNotaDebito.getVentaNotaDebitoFormulario().setNumnd(UtilitarioCadenas.formatoNumeroDocumento(Integer.parseInt(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getNumnd())));

            ResultadoServicio rs = servicioVentaNotaDebito.guardarVentaNotaDebito(bkVentaNotaDebito.getVentaNotaDebitoFormulario());
            Integer ID = (Integer) rs.getID();

            CorrelativoDocumento correlativo = new CorrelativoDocumento();
            TipoDocumento tipoDocumento = new TipoDocumento();
            tipoDocumento.setNombre(Constantes.TipoDocumento.TIPO_DOC_NOTA_DEBITO);

            Integer numero = Integer.parseInt(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getNumnd()) + 1;
            //System.out.println("numero 2: " + numero);

            correlativo.setIdTipoDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorNombre(tipoDocumento));
            correlativo.setIdsede(session.getSede());
            correlativo.setSerie(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getSeriend());
            CorrelativoDocumento correlativoEncontrado = servicioCorrelativo.obtenerCorrelativoTipoDocSede1(correlativo);

            if (numero > Integer.parseInt(correlativoEncontrado.getNumero())) {
                correlativoEncontrado.setNumero(UtilitarioCadenas.formatoNumeroDocumento(numero));
                servicioCorrelativo.actualizarCorrelativoDocumento(correlativoEncontrado);
            }

            for (VentaDetalleNotaDebito detalle : bkVentaDetalleNotaDebito.getListaDetalleNotaDebito()) {
                detalle.setCodnd(servicioVentaNotaDebito.obtenerNotaDebitobyID(ID));
                servicioVentaDetalleNotaDebito.guardarVentaDetalleNotaDebito(detalle);

            }
            buscarListaNotasDebito();

            bkVentaNotaDebito.setVentaNotaDebitoSeleccionado(bkVentaNotaDebito.getVentaNotaDebitoFormulario());
            mostrarMensaje("Se guardó la Nota de Débito satisfactoriamente.");
            //return URLPaginacion.Ventas.URL_FORMULARIO_EDITAR_NOTA_DEBITO;
            return editar();
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_DEBITO;
        }
    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String editar() {
        mbComponenteFindCliente.clearObserver();
        mbComponenteFindCliente.addObserver(this);
        mbComponenteAddVentaDetalleND.clearObserver();
        mbComponenteAddVentaDetalleND.addObserver(this);
        bkVentaNotaDebito.setComando(new ComandoActualizar(this));
        try {
            bkVentaNotaDebito.setListaTipoMoneda(new ArrayList<TipoMoneda>(servicioTipoMoneda.listarTipoMonedasActivos()));
            bkVentaDetalleNotaDebito.setListaDetalleNotaDebito(new ArrayList<VentaDetalleNotaDebito>());
            bkVentaNotaDebito.setVentaNotaDebitoFormulario(bkVentaNotaDebito.getVentaNotaDebitoSeleccionado());
            //bkVentaNotaDebito.setIdTipoMoneda(servicioVentaNotaDebito.obtenerIdMonedaNotaDebito(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getCodnd()));
            bkVentaNotaDebito.setNumero(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getSeriend().concat(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getNumnd()));
            bkVentaDetalleNotaDebito.setListaDetalleNotaDebito(new ArrayList<VentaDetalleNotaDebito>());
            bkVentaDetalleNotaDebito.setListaDetalleNotaDebito(servicioVentaDetalleNotaDebito.obtenerVentaDetalleNotaDebito(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getCodnd()));
            actualizarEstado();
            return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_DEBITO;
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_LISTA_NOTA_DEBITO;
        }
    }

    @Override
    public String nuevo() {
        mbComponenteFindCliente.clearObserver();
        mbComponenteAddVentaDetalleND.clearObserver();
        bkVentaNotaDebito.setComando(new ComandoGuardar(this));
        try {
            //cargar correlativo

            mbComponenteFindCliente.addObserver(this);
            mbComponenteAddVentaDetalleND.addObserver(this);
            VentaNotaDebito notadebito = new VentaNotaDebito();
            notadebito.setEstado(COLOR_ESTADO_VENTA.CREADA.getEstado());
            notadebito.setFechand(new Date());
            notadebito.setSede(session.getSede());

            List<TipoCambio> lista = (List<TipoCambio>) servicioTipoCambio.listarTipoCambiosPorFiltro(new Date(), new Date());

            if (lista.isEmpty()) {
                mostrarError("Ingresar el Tipo de Cambio del día de hoy");
                return URLPaginacion.Ventas.URL_LISTA_NOTA_DEBITO;
            } else {
                notadebito.setTipocamb(lista.get(0).getVenta().doubleValue());

            }

            TipoDocumento tipoDocumento = new TipoDocumento();
            tipoDocumento.setNombre(Constantes.TipoDocumento.TIPO_DOC_NOTA_DEBITO);
            CorrelativoDocumento correlativo = new CorrelativoDocumento();
            correlativo.setIdsede(session.getSede());
            correlativo.setIdTipoDocumento(servicioTipoDocumento.obtenerTipoDocumentoPorNombre(tipoDocumento));
            bkVentaNotaDebito.setListaCorrelativos(servicioCorrelativo.listarCorrelativoPorDocumentoYSede(correlativo));

            bkVentaNotaDebito.setVentaNotaDebitoFormulario(notadebito);
            bkVentaNotaDebito.setListaTipoMoneda(new ArrayList<TipoMoneda>(servicioTipoMoneda.listarTipoMonedasActivos()));
            bkVentaDetalleNotaDebito.setListaDetalleNotaDebito(new ArrayList<VentaDetalleNotaDebito>());


        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_LISTA_NOTA_DEBITO;
        }

        return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_DEBITO;
    }

    @Override
    public String ver() {
        try {
            bkVentaNotaDebito.setListaTipoMoneda(new ArrayList<TipoMoneda>(servicioTipoMoneda.listarTipoMonedasActivos()));
            bkVentaDetalleNotaDebito.setListaDetalleNotaDebito(new ArrayList<VentaDetalleNotaDebito>());
            bkVentaNotaDebito.setVentaNotaDebitoFormulario(bkVentaNotaDebito.getVentaNotaDebitoSeleccionado());
            bkVentaNotaDebito.setIdTipoMoneda(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getMoneda().getId());
            bkVentaNotaDebito.setNumero(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getSeriend() + "-" + bkVentaNotaDebito.getVentaNotaDebitoFormulario().getNumnd());
            bkVentaDetalleNotaDebito.setListaDetalleNotaDebito(new ArrayList<VentaDetalleNotaDebito>());
            bkVentaDetalleNotaDebito.setListaDetalleNotaDebito(servicioVentaDetalleNotaDebito.obtenerVentaDetalleNotaDebito(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getCodnd()));
            actualizarEstado();
            return URLPaginacion.Ventas.URL_FORMULARIO_VER_NOTA_DEBITO;
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
            return URLPaginacion.Ventas.URL_LISTA_NOTA_DEBITO;
        }
    }

    @Override
    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void actualizarObservador(Object object) {
        if (object instanceof Cliente) {
            Cliente cliente = (Cliente) object;
            bkVentaNotaDebito.getVentaNotaDebitoFormulario().setIdcliente(cliente);
            bkVentaNotaDebito.getVentaNotaDebitoFormulario().setRuc(cliente.getNumeroDocumento());
            bkVentaNotaDebito.getVentaNotaDebitoFormulario().setEmpresa(cliente.getRazonSocial());
            bkVentaNotaDebito.getVentaNotaDebitoFormulario().setDireccion(cliente.getDireccionLegal());
        }
        if (object instanceof BKComponenteAddVentaDetalleND) {

            BKComponenteAddVentaDetalleND comp = (BKComponenteAddVentaDetalleND) object;
            VentaDetalleNotaDebito detalle = new VentaDetalleNotaDebito();
            detalle.setDescripcion(comp.getDescripcion());
            detalle.setImporte(comp.getTotal());

            bkVentaDetalleNotaDebito.getListaDetalleNotaDebito().add(detalle);

            try {
                double total = 0.0;
                double subtotal = 0.0;
                double igv = 0.0;
                for (VentaDetalleNotaDebito detallev : bkVentaDetalleNotaDebito.getListaDetalleNotaDebito()) {
                    total = total + detallev.getImporte();
                }

                igv = servicioIgv.ConseguirIgvVigente().getMonto().doubleValue() * total / 100;
                subtotal = total - igv;


                bkVentaNotaDebito.getVentaNotaDebitoFormulario().setImporte(subtotal);
                bkVentaNotaDebito.getVentaNotaDebitoFormulario().setIgv(igv);
                bkVentaNotaDebito.getVentaNotaDebitoFormulario().setTotal(total);

                convertirALetra();
            } catch (ServiceException e) {
                mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
                logger.error(e.getMessage(), e);
            }
        }
    }

    public void buscarListaNotasDebito() {
        try {
            bkVentaNotaDebito.setListaNotasDebito(servicioVentaNotaDebito.obtenerVentaNotaDebitoBusqueda(
                    bkVentaNotaDebito.getVentaNotaDebitoBusqueda(), bkVentaNotaDebito.getBusquedaDel(), bkVentaNotaDebito.getBusquedaAl()));

        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public String mostrar() {
        VentaNotaDebito notadebito = new VentaNotaDebito();
        notadebito.setNumnd("");
        notadebito.setRuc("");
        notadebito.setEmpresa("");
        notadebito.setSede(session.getSede());
        bkVentaNotaDebito.setVentaNotaDebitoBusqueda(notadebito);
        bkVentaNotaDebito.setBusquedaDel(null);
        bkVentaNotaDebito.setBusquedaAl(null);
        return URLPaginacion.Ventas.URL_LISTA_NOTA_DEBITO;
    }

    public void anular() {
        bkVentaNotaDebito.getVentaNotaDebitoFormulario().setEstado(COLOR_ESTADO_VENTA.ANULADO.getEstado());
        servicioVentaNotaDebito.actualizarVentaNotaDebito(bkVentaNotaDebito.getVentaNotaDebitoFormulario());
        actualizarEstado();
    }

    public String imprimir() {
        /*if (bkVentaNotaDebito.getVentaNotaDebitoFormulario().getEstado() == COLOR_ESTADO_VENTA.CREADA.getEstado()) {
         bkVentaNotaDebito.getVentaNotaDebitoFormulario().setEstado(COLOR_ESTADO_VENTA.EMITIDO.getEstado());
         //servicioVentaNotaDebito.actualizarVentaNotaDebito(bkVentaNotaDebito.getVentaNotaDebitoFormulario());
         VentaLineaCredito lineaCredito = new VentaLineaCredito();
         try {
         lineaCredito = servicioVentaLineaCredito.getVentaLineaCredito(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getRuc());
         } catch (ServiceException e) {
         mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
         logger.error(e.getMessage(), e);
         }

         if (lineaCredito != null) {
         if (lineaCredito.getLineaSaldo() < bkVentaNotaDebito.getVentaNotaDebitoFormulario().getTotal()) {
         mostrarWarning("Linea de credito insuficiente.");
         return URLPaginacion.Ventas.URL_FORMULARIO_FACTURA;
         } else {
         VentaLineaCreditoDetalle detalle = new VentaLineaCreditoDetalle();
         detalle.setDetalleConsumo("ND/" + bkVentaNotaDebito.getVentaNotaDebitoFormulario().getSeriend() + "-" + bkVentaNotaDebito.getVentaNotaDebitoFormulario().getNumnd());
         detalle.setMontoConsumo(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getMoneda().getId() == TIPO_MONEDA.SOLES.getValor() ? bkVentaNotaDebito.getVentaNotaDebitoFormulario().getTotal() : bkVentaNotaDebito.getVentaNotaDebitoFormulario().getTotal() * bkVentaNotaDebito.getVentaNotaDebitoFormulario().getTipocamb());
         detalle.setFechaOperacion(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getFechand());
         detalle.setLineaSaldo(lineaCredito.getLineaSaldo() - detalle.getMontoConsumo());
         detalle.setIdlinea(lineaCredito);
         servicioVentaLineaCreditoDetalle.guardarLineaCreditoDetalle(detalle);

         lineaCredito.setLineaUsada(lineaCredito.getLineaUsada() + detalle.getMontoConsumo());
         lineaCredito.setLineaSaldo(lineaCredito.getLineaCredito() - lineaCredito.getLineaUsada());

         servicioVentaLineaCredito.actualizarLineaCredito(lineaCredito);
         }
         } else {
         mostrarWarning("El cliente no tiene linea de credito asignado.");
         return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_DEBITO;
         }


         }*/
        //if (bkVentaNotaDebito.getVentaNotaDebitoFormulario().getEstado() == COLOR_ESTADO_VENTA.EMITIDO.getEstado()) {
        if (!VentaFacturacionPrintHelper.verificarImpresora(session.getSede().getRecursoImpresora())) {
            mostrarError("No se pudo conectar con la impresora");
            return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_DEBITO;
        }

        try {
            bkVentaNotaDebito.getVentaNotaDebitoFormulario().setEstado(COLOR_ESTADO_VENTA.EMITIDO.getEstado());
            
            if (bkVentaNotaDebito.getComando().getNombre().equalsIgnoreCase("Actualizar")) {
                actualizar();
            } else {
                guardar();
            }
            
            if (bkVentaNotaDebito.getVentaNotaDebitoFormulario().getCodnd()== null) {
                mostrarError("Error al guardar el formulario. Verifique que los datos sean correctos.");
                return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_DEBITO;
            }

            VentaFacturacionPrintHelper.imprimirNotaDebito(bkVentaNotaDebito.getVentaNotaDebitoFormulario(),
                    bkVentaDetalleNotaDebito.getListaDetalleNotaDebito(), session.getSede().getRecursoImpresora());

            actualizarEstado();
            mostrarMensaje("Se lanzó la impresión satisfactoriamente.");
            return ver();

        } catch (PrinterException e) {
            mostrarError("No se pudo realizar la impresión");
            e.printStackTrace();
            return URLPaginacion.Ventas.URL_FORMULARIO_NOTA_DEBITO;
        }
        //}






    }

    public void buscarNumDoc() {
        for (CorrelativoDocumento correlativo : bkVentaNotaDebito.getListaCorrelativos()) {
            if (correlativo.getSerie().equalsIgnoreCase(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getSeriend())) {
                bkVentaNotaDebito.getVentaNotaDebitoFormulario().setNumnd(correlativo.getNumero());
            }
        }
    }

    public void exportar() {
    }

    public void eliminarDetalle() {

        if (bkVentaDetalleNotaDebito.getDetalleNotaDebitoSeleccionado().getCodnditem() == null) {
            Iterator itr = bkVentaDetalleNotaDebito.getListaDetalleNotaDebito().iterator();
            while (itr.hasNext()) {
                VentaDetalleNotaDebito det = (VentaDetalleNotaDebito) itr.next();

                if (bkVentaDetalleNotaDebito.getDetalleNotaDebitoSeleccionado().getDescripcion().equalsIgnoreCase(det.getDescripcion())) {
                    itr.remove();
                    break;
                }
            }
        } else {
            bkVentaDetalleNotaDebito.getListaDetalleNotaDebito().remove(bkVentaDetalleNotaDebito.getDetalleNotaDebitoSeleccionado());
        }


        try {
            double total = 0.0;
            double subtotal = 0.0;
            double igv = 0.0;
            for (VentaDetalleNotaDebito detallev : bkVentaDetalleNotaDebito.getListaDetalleNotaDebito()) {
                subtotal = subtotal + detallev.getImporte();
            }

            igv = servicioIgv.ConseguirIgvVigente().getMonto().doubleValue() * subtotal / 100;
            total = subtotal + igv;

            bkVentaNotaDebito.getVentaNotaDebitoFormulario().setImporte(subtotal);
            bkVentaNotaDebito.getVentaNotaDebitoFormulario().setIgv(igv);
            bkVentaNotaDebito.getVentaNotaDebitoFormulario().setTotal(total);
            convertirALetra();
        } catch (ServiceException e) {
            mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
            logger.error(e.getMessage(), e);
        }
    }

    public void actualizarEstado() {


        if (bkVentaNotaDebito.getVentaNotaDebitoFormulario().getEstado() == COLOR_ESTADO_VENTA.ANULADO.getEstado()) {
            bkVentaNotaDebito.setEstado(COLOR_ESTADO_VENTA.ANULADO.getValor());
            bkVentaNotaDebito.setColor(COLOR_ESTADO_VENTA.ANULADO.getColor());
            bkVentaNotaDebito.setEditable(true);
            bkVentaNotaDebito.setAnulable(true);
        }
        if (bkVentaNotaDebito.getVentaNotaDebitoFormulario().getEstado() == COLOR_ESTADO_VENTA.CREADA.getEstado()) {
            bkVentaNotaDebito.setEstado(COLOR_ESTADO_VENTA.CREADA.getValor());
            bkVentaNotaDebito.setColor(COLOR_ESTADO_VENTA.CREADA.getColor());
            bkVentaNotaDebito.setEditable(false);
            bkVentaNotaDebito.setAnulable(false);
        }
        if (bkVentaNotaDebito.getVentaNotaDebitoFormulario().getEstado() == COLOR_ESTADO_VENTA.EMITIDO.getEstado()) {
            bkVentaNotaDebito.setEstado(COLOR_ESTADO_VENTA.EMITIDO.getValor());
            bkVentaNotaDebito.setColor(COLOR_ESTADO_VENTA.EMITIDO.getColor());
            bkVentaNotaDebito.setEditable(true);
            bkVentaNotaDebito.setAnulable(false);
        }
        if (bkVentaNotaDebito.getVentaNotaDebitoFormulario().getEstado() == COLOR_ESTADO_VENTA.PAGADA.getEstado()) {
            bkVentaNotaDebito.setEstado(COLOR_ESTADO_VENTA.PAGADA.getValor());
            bkVentaNotaDebito.setColor(COLOR_ESTADO_VENTA.PAGADA.getColor());
            bkVentaNotaDebito.setEditable(true);
            bkVentaNotaDebito.setAnulable(true);
        }

        if (bkVentaNotaDebito.getVentaNotaDebitoFormulario().getEstado() == COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getEstado()) {
            bkVentaNotaDebito.setEstado(COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getValor());
            bkVentaNotaDebito.setColor(COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getColor());
            bkVentaNotaDebito.setEditable(true);
            bkVentaNotaDebito.setAnulable(false);
        }
    }

    public void marcarInicio(DateSelectEvent event) {
        bkVentaNotaDebito.setBusquedaDel(event.getDate());
    }

    public void marcarFinal(DateSelectEvent event) {
        bkVentaNotaDebito.setBusquedaAl(event.getDate());
    }

    public void convertirALetra() {
        if (bkVentaNotaDebito.getVentaNotaDebitoFormulario().getTotal() != null) {
            UtilitarioNumeroALetras valorLetras = new UtilitarioNumeroALetras();
            bkVentaNotaDebito.getVentaNotaDebitoFormulario().setTotalletras(valorLetras.Convertir(String.valueOf(bkVentaNotaDebito.getVentaNotaDebitoFormulario().getTotal()), true,
                    bkVentaNotaDebito.getVentaNotaDebitoFormulario().getMoneda().getNombre()));
        }

    }
    
    public boolean estaHabilitado(char estado) {
        if (estado == COLOR_ESTADO_VENTA.EMITIDO.getEstado() || estado == COLOR_ESTADO_VENTA.ANULADO.getEstado()) {
            return true;
        } else {
            return false;
        }
    }
}
